package com.yzf.enterprise.common.utils;


import sun.reflect.Reflection;

/**
 * @author yuyue
 * @version 2018-08-31 17:09
 */
public final class ClassUtil extends SecurityManager {

    /**
     * Reflection.getCallerClass(depth)
     * 0->sun.reflect.Reflection
     * 1->本类ClassUtil带参数的getCaller
     * 2->本类ClassUtil不带参数的getCaller
     * 3->调用类
     * 4->调用类的上级
     */
    public static final int DEPTH = 4;

    public static Class<?> getCallerClz() {
        return getCallerClz(DEPTH);
    }

    @SuppressWarnings("deprecation")
    public static Class<?> getCallerClz(int depth) {
        return Reflection.getCallerClass(depth);
    }

    public static final ClassUtil INSTANCE = new ClassUtil();

    public Class[] getCallerClzArr() {
        return getClassContext();
    }

    /**
     * 判断两个对象是否是同类
     */
    public static boolean isSameClass(Object object1, Object object2) {
        if (object1 != null && object2 != null) {
            return object1.getClass() == object2.getClass();
        }
        return object1 == object2;
    }


    //public static Class<?> getCallerClass() {
    //    StackTraceElement[] stElements = Thread.currentThread().getStackTrace();
    //    for (int i = 1; i < stElements.length; i++) {
    //        String className = stElements[i].getClassName();
    //        if (!ClassUtil.class.getName().equals(className) && className.indexOf("java.lang.Thread") != 0) {
    //            try {
    //                return Class.forName(className);
    //            } catch (ClassNotFoundException e) {
    //            }
    //        }
    //    }
    //    return null;
    //}
    //
    //public static String getCallerCallerClassName() {
    //    StackTraceElement[] stElements = Thread.currentThread().getStackTrace();
    //    String callerClassName = null;
    //    for (int i = 1; i < stElements.length; i++) {
    //        StackTraceElement ste = stElements[i];
    //        if (!ste.getClassName().equals(ClassUtil.class.getName()) && ste.getClassName().indexOf("java.lang.Thread") != 0) {
    //            if (callerClassName == null) {
    //                callerClassName = ste.getClassName();
    //            } else if (!callerClassName.equals(ste.getClassName())) {
    //                return ste.getClassName();
    //            }
    //        }
    //    }
    //    return null;
    //}


    private ClassUtil() {
    }
}
